library(tidyverse)
Registered S3 methods overwritten by 'dbplyr':
method from
print.tbl_lazy
print.tbl_sql
── Attaching packages ───────────────────────────────────────────────────────────────────────────────────── tidyverse 1.3.1 ──
✓ ggplot2 3.3.5 ✓ purrr 0.3.4
✓ tibble 3.1.3 ✓ dplyr 1.0.7
✓ tidyr 1.1.3 ✓ stringr 1.4.0
✓ readr 2.0.1 ✓ forcats 0.5.1
── Conflicts ──────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
x dplyr::filter() masks stats::filter()
x dplyr::lag() masks stats::lag()
library(janitor)
Attaching package: ‘janitor’
The following objects are masked from ‘package:stats’:
chisq.test, fisher.test
library(readODS)
library(httr)
library(here)
here() starts at /Users/tomdavie/Documents/GitHub/ev_climate_change_project
library(data.table)
Registered S3 method overwritten by 'data.table':
method from
print.data.table
data.table 1.14.0 using 1 threads (see ?getDTthreads). Latest news: r-datatable.com
**********
This installation of data.table has not detected OpenMP support. It should still work but in single-threaded mode.
This is a Mac. Please read https://mac.r-project.org/openmp/. Please engage with Apple and ask them for support. Check r-datatable.com for updates, and our Mac instructions here: https://github.com/Rdatatable/data.table/wiki/Installation. After several years of many reports of installation problems on Mac, it's time to gingerly point out that there have been no similar problems on Windows or Linux.
**********
Attaching package: ‘data.table’
The following objects are masked from ‘package:dplyr’:
between, first, last
The following object is masked from ‘package:purrr’:
transpose
library(sf)
Linking to GEOS 3.8.1, GDAL 3.2.1, PROJ 7.2.1
library(leaflet)
Registered S3 method overwritten by 'htmlwidgets':
method from
print.htmlwidget tools:rstudio
read_ods(here("raw_data/electric-vehicle-charging-device-statistics-june-2021.ods"))
Error in .parse_ods_file(file) : file does not exist
getwd()
APE <- read_ods("raw_data/APE_site_data_tables.ods", sheet = 2)
NO2 <- read_ods("raw_data/NO2_tables.ods")
registry <- GET("http://chargepoints.dft.gov.uk/api/retrieve/registry/format/csv/") %>%
content()
type <- GET("http://chargepoints.dft.gov.uk/api/retrieve/type/format/csv/") %>%
content()
read_csv("Documents/GitHub/ev_climate_change_project/raw_data/no2_by_grid_2019.csv")
air_pollution_cap <- GET("https://uk-air.defra.gov.uk/data/sos/service?service=AQD&request=GetCapabilities")
air_pollution_cap <- rbindlist(air_pollution$content, fill = TRUE)
air_pollution_cap <- unnest(air_pollution_cap)
air_pollution <- GET("https://uk-air.defra.gov.uk/data/sos/service?service=SOS&version=2.0.0&request=GetObserved&observedProperty=http://dd.eionet.europa.eu/vocabulary/aq/pollutant/8") %>%
content()
air_pollution$exceptions
air_pollution <- rbindlist(air_pollution, fill = TRUE)
Error in rbindlist(air_pollution, fill = TRUE) :
Input is data.table but should be a plain list of items to be stacked
air_pollution <- unnest(air_pollution)
How many electric vehicles are on the road across the UK by LA?
# Reading in and skipping first 5 rows
uk_ev <- read_ods(here("raw_data/ev_by_la.ods"), sheet = 2, skip = 5)
# Making row 1 the variable name
names(uk_ev) <- uk_ev[1,]
# Removing row 1
uk_ev <- uk_ev[-1,] %>%
clean_names()
# loading in shape file
uk_shape_file <- st_read(here("raw_data/Local_Authority_Districts__April_2019__UK_BFE_v2-shp/Local_Authority_Districts__April_2019__UK_BFE_v2.shp")) %>%
clean_names() %>%
st_simplify(dTolerance = 1000) %>%
st_transform("+proj=longlat +datum=WGS84") %>%
select(lad19cd, long, lat, geometry)
Error in (function (cond) :
error in evaluating the argument 'x' in selecting a method for function 'select': Cannot open "/Users/tomdavie/Documents/GitHub/ev_climate_change_project/raw_data/Local_Authority_Districts__April_2019__UK_BFE_v2-shp/Local_Authority_Districts__April_2019__UK_BFE_v2.shp"; The file doesn't seem to exist.
# Joining uk_ev + shape file
uk_ev_map <- uk_ev %>%
left_join(uk_shape_file, by = c("ons_la_code_apr_2019" = "lad19cd")) %>%
drop_na() %>%
mutate(across(c(x2021_q1:x2011_q4), as.numeric)) %>%
st_as_sf()
pal <- colorBin("Greens", domain = uk_ev_map$x2021_q1, bins = c(0, 500, 1000, 2500, 5000, 10000, 15000))
uk_ev_map_labels <- sprintf(
"<strong>%s</strong><br/>%g Electric Vehicles",
uk_ev_map$region_local_authority_apr_2019_3, uk_ev_map$x2021_q1) %>%
lapply(htmltools::HTML)
# Geospatial of EV Vehicles in the UK 2021 Q1
uk_ev_map %>%
leaflet() %>%
setView(lng = -4.2026, lat = 55.8, zoom = 4.7, options = list()) %>%
addProviderTiles(providers$CartoDB.Positron) %>%
addPolygons(fillColor = ~pal(x2021_q1),
weight = 0.1,
opacity = 0.9,
color = "black",
fillOpacity = 0.8,
highlightOptions = highlightOptions(color = "green", weight = 2,
bringToFront = TRUE),
label = uk_ev_map_labels,
labelOptions = labelOptions(
style = list("font-weight" = "normal", padding = "3px 8px"),
textsize = "15px",
direction = "auto")) %>%
addLegend(pal = pal, values = ~x2021_q1, opacity = 0.7, title = NULL,
position = "bottomright")
How many electric vehicles are on the road across the UK by LA?
# Reading in and skipping first 5 rows
uk_ev_postcode <- read_ods(here("raw_data/ev_by_postcode.ods"), sheet = 2, skip = 6) %>%
rename("postcode" = PostcodeDistrict2)
Error: Can't rename columns that don't exist.
x Column `PostcodeDistrict2` doesn't exist.
Run `rlang::last_error()` to see where the error occurred.
# loading in shape file
uk_shape_file_postcode <- st_read(here("raw_data/postcode_shape/EX_Sample.shp")) %>%
clean_names() %>%
st_simplify(dTolerance = 1000) %>%
st_transform("+proj=longlat +datum=WGS84") #%>%
# select(lad19cd, long, lat, geometry)
# Joining uk_ev + shape file
uk_ev_map_postcode <- uk_ev_postcode %>%
left_join(uk_shape_file_postcode, by = c("ons_la_code_apr_2019" = "lad19cd")) %>%
drop_na() %>%
mutate(across(c(x2021_q1:x2011_q4), as.numeric)) %>%
st_as_sf()
pal <- colorBin("Greens", domain = uk_ev_map$x2021_q1, bins = c(0, 500, 1000, 2500, 5000, 10000, 15000))
uk_ev_map_labels <- sprintf(
"<strong>%s</strong><br/>%g Electric Vehicles",
uk_ev_map$region_local_authority_apr_2019_3, uk_ev_map$x2021_q1) %>%
lapply(htmltools::HTML)
# Geospatial of EV Vehicles in the UK 2021 Q1
uk_ev_map %>%
leaflet() %>%
setView(lng = -4.2026, lat = 55.8, zoom = 4.7, options = list()) %>%
addProviderTiles(providers$CartoDB.Positron) %>%
addPolygons(fillColor = ~pal(x2021_q1),
weight = 0.1,
opacity = 0.9,
color = "black",
fillOpacity = 0.8,
highlightOptions = highlightOptions(color = "green", weight = 2,
bringToFront = TRUE),
label = uk_ev_map_labels,
labelOptions = labelOptions(
style = list("font-weight" = "normal", padding = "3px 8px"),
textsize = "15px",
direction = "auto")) %>%
addLegend(pal = pal, values = ~x2021_q1, opacity = 0.7, title = NULL,
position = "bottomright")
# Wrangling to create an EV count over time plot
uk_ev_longer <- uk_ev %>%
# Pivot longer to get year and count columns
pivot_longer(cols = c(x2021_q1:x2011_q4), names_to = c("year"), values_to = "no_of_ev") %>%
# Filter so we only have UK as a whole data AND we only want final numbers of the year so Q4
filter(region_local_authority_apr_2019_3 == "United Kingdom" & str_detect(year, "q4")) %>%
# Simplify to just show year
mutate(year = case_when(str_detect(year, "2021") ~ "2021",
str_detect(year, "2020") ~ "2020",
str_detect(year, "2019") ~ "2019",
str_detect(year, "2018") ~ "2018",
str_detect(year, "2017") ~ "2017",
str_detect(year, "2016") ~ "2016",
str_detect(year, "2015") ~ "2015",
str_detect(year, "2014") ~ "2014",
str_detect(year, "2013") ~ "2013",
str_detect(year, "2012") ~ "2012",
str_detect(year, "2011") ~ "2011"),
year = as.numeric(year),
no_of_ev = as.numeric(no_of_ev))

Row binding grid NO2 data
no2_2010 <- read_csv(here("raw_data/no2_by_grid_2010.csv"), skip = 6,
col_names = c("uk_grid_code", "x", "y", "no2"))
no2_2011 <- read_csv(here("raw_data/no2_by_grid_2011.csv"), skip = 6,
col_names = c("uk_grid_code", "x", "y", "no2"))
no2_2012 <- read_csv(here("raw_data/no2_by_grid_2012.csv"), skip = 6,
col_names = c("uk_grid_code", "x", "y", "no2"))
no2_2013 <- read_csv(here("raw_data/no2_by_grid_2013.csv"), skip = 6,
col_names = c("uk_grid_code", "x", "y", "no2"))
no2_2014 <- read_csv(here("raw_data/no2_by_grid_2014.csv"), skip = 6,
col_names = c("uk_grid_code", "x", "y", "no2"))
no2_2015 <- read_csv(here("raw_data/no2_by_grid_2015.csv"), skip = 6,
col_names = c("uk_grid_code", "x", "y", "no2"))
no2_2016 <- read_csv(here("raw_data/no2_by_grid_2016.csv"), skip = 6,
col_names = c("uk_grid_code", "x", "y", "no2"))
no2_2017 <- read_csv(here("raw_data/no2_by_grid_2017.csv"), skip = 6,
col_names = c("uk_grid_code", "x", "y", "no2"))
no2_2018 <- read_csv(here("raw_data/no2_by_grid_2018.csv"), skip = 6,
col_names = c("uk_grid_code", "x", "y", "no2"))
no2_2019 <- read_csv(here("raw_data/no2_by_grid_2019.csv"), skip = 6,
col_names = c("uk_grid_code", "x", "y", "no2"))
# Create empty data frame
no2_all <- data_frame()
# For each year, bind rows to one dataset
for (i in 2010:2019) {
df_name <- paste0("no2_", i)
df_input <- as.name(df_name)
df <- eval(df_input) %>%
mutate(year = i)
no2_all <- bind_rows(no2_all, df)
}
# Remove missing NO2 grid values
no2_clean <- no2_all %>%
filter(no2 != "MISSING")
library(proj4)
proj4string <- "+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +ellps=airy +datum=OSGB36 +units=m +no_defs"
no2_clean_row <- no2_clean %>%
rowid_to_column()
# Source data
xy <- no2_clean_row %>%
select(x, y, rowid)
# Transformed data
pj <- project(xy, proj4string, inverse=TRUE)
latlon <- data.frame(xy, lat=pj$y, lon=pj$x)
final <- merge(no2_clean_row, latlon, by.x = "rowid", by.y = "rowid") %>%
filter(year == 2019) %>%
select(lat, lon, no2)